package com.example.mydianping.utils;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * 使用 long 类型，首位为0，前31位为id生成的时间（单位：秒），最后32位是序列号，通过 redis 实现自增
 */
@Component
public class CreateOnlyId {
    //设置开始的时间戳，可以通过打印系统当前时间设置,
    private static final long begin = 1640995200L;
    private StringRedisTemplate stringRedisTemplate;

    public CreateOnlyId(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    //生成全局id
    public long createID(String preKey){
        //id生成时间，31位的时间，可以使用 69 年
        LocalDateTime now = LocalDateTime.now();
        long curSecond = now.toEpochSecond(ZoneOffset.UTC);
        long pre = curSecond - begin;
        //通过 redis 自增，key 每天更新一次,可以保证大访量也不会超出 32 位
        String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));//获取当前日期
        String key = "idr:"+preKey+":"+date;
        Long increment = stringRedisTemplate.opsForValue().increment(key);//自增
        return pre << 32 | increment;
    }
}
